www.gusucode.com > VC++ 同学录信息管理系统源代码-源码程序 > VC++ 同学录信息管理系统源代码-源码程序/code/MyRecordSet.cpp

    // MyRecordSet.cpp: implementation of the MyRecordSet class.
// Download by http://www.NewXing.com
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Mates.h"
#include "MyRecordSet.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

MyRecordSet::MyRecordSet()
{
	isConn=false;
	isOpen=false;
	nFieldRows=0;
	nFieldCols=0;
	try
	{
		m_pConn.CreateInstance(__uuidof(Connection));
		m_pRst.CreateInstance(__uuidof(Recordset));
	}
	catch(...)
	{}

}

MyRecordSet::~MyRecordSet()
{
	if(isOpen) m_pRst->Close();		
	if(isConn) m_pConn->Close();    
}
bool MyRecordSet::ADOOpen(CString strDataType){
	m_strDBType=strDataType;
	return ADOOpen();

}
bool MyRecordSet::ADOOpen()
{	
	ADOConnectionClose();
	isConn=false;
	try{
			m_pConn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=classmate.mdb","","",-1);
		
		m_pRst->CursorLocation = adUseClient;
		isConn=true;	
	}
	catch(...)
	{
		AfxMessageBox("与数据建立连接失败!");		
	}	
	return isConn;
}


bool MyRecordSet::ADOExcute(CString strSQL)
{
	m_strSQL=strSQL;
	return ADOExcute();
}

int MyRecordSet::ADOExcuteNoQuery(CString strSQL)
{
	_variant_t  var;
	_bstr_t sql=strSQL;
	try
	{
		m_pConn->Execute(sql,&var,adCmdText);
		return (int)V_I2(&var);
	}
	catch(...)
	{
		return 0;
	}
}
bool MyRecordSet::ADOExcute()
{
	
	_variant_t sql=m_strSQL;
	nFieldRows=0;
	nFieldCols=0;
	ADOClose();
	isOpen=false;
	try
	{
		m_pRst->Open(sql,m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
		if(m_pRst->State)
		{
			nFieldRows=m_pRst->RecordCount;
			nFieldCols=m_pRst->GetFields()->GetCount();
			isOpen=true;
		}
	}
	catch(...)
	{}
	return isOpen;
}

void MyRecordSet::ADOClose()
{
	if(isOpen)
	{
		m_pRst->Close();
		isOpen=false;
	}	
}

void MyRecordSet::ADOConnectionClose()
{
	
	ADOClose();
	if(isConn)
	{
		m_pConn->Close();
		isConn=false;
	}
}

bool MyRecordSet::ADOEOF()
{
	if(isConn&&isOpen)
		return m_pRst->adoEOF;
	return true;
}
HRESULT MyRecordSet::MoveFirst()
{
	return m_pRst->MoveFirst();
}
HRESULT MyRecordSet::MoveLast()
{
	return m_pRst->MoveLast();
}
HRESULT MyRecordSet::MovePrev()
{
	return m_pRst->MovePrevious();
}
HRESULT MyRecordSet::MoveNext()
{
	return m_pRst->MoveNext();
}

CString MyRecordSet::GetFieldName(int nCol)
{
	CString sValue;
	_variant_t vValue;
	vValue=m_pRst->GetFields()->GetItem((long)nCol)->Name;
	if(vValue.vt==VT_EMPTY||vValue.vt==VT_NULL)
		sValue="";
	else
		sValue=(char*)(_bstr_t)vValue;
	sValue.TrimLeft();
	sValue.TrimRight();
	return sValue;
}

CString MyRecordSet::GetFieldString(CString strFieldName)
{
	_variant_t strField=strFieldName;
	_variant_t var;
	
	try
	{
		var=m_pRst->GetCollect(strField);
	}
	catch(...)
	{
		AfxMessageBox("读取数据失败");
		return "";
	}
   	return VariantToCString(var);
}

CString MyRecordSet::GetFieldString(int nCol)
{
	_variant_t var;
	try
	{
		var=m_pRst->GetCollect((long)nCol);
	}
	catch(...)
	{
		AfxMessageBox("读取数据失败");
		return "";
	}
	return VariantToCString(var);
}

int MyRecordSet::GetFieldNumber(int nCol)
{
	_variant_t var;
	try
	{
		var=m_pRst->GetCollect((long)nCol);
	}
	catch(...)
	{
		AfxMessageBox("读取数据失败");
		return 0;
	}
	return (int)V_I2(&var);
}

int MyRecordSet::GetFieldNumber(CString strFieldName)
{
	_variant_t strField=strFieldName;
	_variant_t var;
	try
	{
		var=m_pRst->GetCollect(strField);
	}
	catch(...)
	{
		AfxMessageBox("读取数据失败");
		return 0;
	}
	return (int)V_I2(&var);
}

float MyRecordSet::GetFieldFloat(int nCol)
{
	_variant_t var;
	try
	{
		var=m_pRst->GetCollect((long)nCol);
	}
	catch(...)
	{
		AfxMessageBox("读取数据失败");
		return 0;
	}

	return (float)V_R4(&var);
}

float MyRecordSet::GetFieldFloat(CString strField)
{
	_variant_t vField=strField;
	_variant_t var;
	try
	{
		var=m_pRst->GetCollect(vField);
	}
	catch(...)
	{
		AfxMessageBox("读取数据失败");
		return 0;
	}
	return (float)V_R4(&var);
}
CString MyRecordSet::VariantToCString(VARIANT var)
{
   	CString strValue;
	_variant_t var_t;
	_bstr_t bst_t;
	time_t cur_time;
	CTime time_value;
	COleCurrency var_currency;
	switch(var.vt){
	case VT_EMPTY:strValue=_T("");break;
	case VT_UI1:strValue.Format ("%d",var.bVal);break;
	case VT_I2:strValue.Format ("%d",var.iVal );break;
	case VT_I4:strValue.Format ("%d",var.lVal);break;
	case VT_R4:strValue.Format ("%f",var.fltVal);break;
	case VT_R8:strValue.Format ("%f",var.dblVal);break;
	case VT_CY:
		var_currency=var;
		strValue=var_currency.Format(0);
		break;
	case VT_BSTR:
		var_t=var;
		bst_t=var_t;
		strValue.Format ("%s",(const char*)bst_t);
		break;
	case VT_NULL:strValue=_T("");break;
	case VT_DATE:
		cur_time=var.date;
		time_value=cur_time;
        strValue=time_value.Format("%Y-%m-%d");
		break;
	case VT_BOOL:strValue.Format ("%d",var.boolVal );break;
	default:strValue=_T("");break;
	}
	return strValue;
}

CString MyRecordSet::TimeToString(CTime time)
{
	CString   str;
	str=time.Format("%Y-%m-%d");
	return str;
}

CTime MyRecordSet::StringToTime(CString str){
	if(str.IsEmpty())
		str="1990-1-1";
	int   y,m,d;
	y=atoi(str);
	int   i,j;   
	i=str.Find('-',0);
	j=str.Find('-',i+1);
	CString   temp;   
	while(i<j-1)   
		temp+=str.GetAt(++i);   
	m=atoi(temp);
	temp.Empty();   
	i=str.GetLength();    
	while(j<i-1)   
		temp+=str.GetAt(++j);   
	d=atoi(temp);
	CTime   tmp(y,m,d,0,0,0);
	return tmp;
}